/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control.dao;

import model.Filme;
import BD.CriaConexao;
import IRepositorios.IRepositorioFilme;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Andre
 */
public class metodosFilme implements IRepositorioFilme {

    private Connection conexao;

    public metodosFilme() {
        try {
            this.conexao = CriaConexao.getConexao();
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void cadastrar(Filme filme) {
        String sql = "insert into filme (titulo, data_lancamento, diretor, sinopse, preco_locacao, cod_genero) values (?, ?, ?, ?, ?, ?)";



        String sql_ator_has_filme = "insert into ator_has_filme(ator_cod_ator,filme_cod_filme) values (?,?)";

        String sql_dvd = "insert into dvd(cod_filme_dvd) values (?)";
        //String sql_id="SELECT MAX(codigo) FROM filme  ";

        try {
            PreparedStatement stmt = conexao.prepareStatement(sql);


            PreparedStatement stmt_ator_has_filme = conexao.prepareStatement(sql_ator_has_filme);
            PreparedStatement stmt_dvd = conexao.prepareStatement(sql_dvd);

            stmt.setString(1, filme.getTitulo());
            java.sql.Date sqlDate = new java.sql.Date(filme.getDataLancamento().getTime());
            stmt.setDate(2, sqlDate);
            stmt.setString(3, filme.getDiretor());
            stmt.setString(4, filme.getSinopse());
            stmt.setFloat(5, filme.getPrecoLocacao());

            //procurando o cod do genero
            int cod_genero = buscarCodGenero(filme.getGenero());

            stmt.setInt(6, cod_genero);
            stmt.execute();
            stmt.close();
            //buscando cod do filme inserido               
            int cod_filme = buscarCodFilme(filme.getTitulo());
            //inserindo dvds
            stmt_dvd.setInt(1, cod_filme);
            for (int i = 0; i < filme.getNumeroCopias(); i++) {

                stmt_dvd.execute();
            }
            stmt_dvd.close();
            //busacr codigos dos atores
            List<Integer> cod_atores = buscaCodAtores(filme.getAtores());
            for (int i = 0; i < cod_atores.size(); i++) {

                stmt_ator_has_filme.setInt(1, cod_atores.get(i));
                stmt_ator_has_filme.setInt(2, cod_filme);
                stmt_ator_has_filme.execute();
            }
            stmt_ator_has_filme.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int buscarCodFilme(String nome) {
        String sql = "select cod_filme from filme where titulo like ?";
        try {
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setString(1, nome);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                return rs.getInt("cod_filme");
            }
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return -1;
    }

    public int qtdDVDs(int cod_filme) {
        String sql = "select count(*) from dvd d where d.cod_filme_dvd = ?";
        PreparedStatement stmt;
        int qtd = 0;
        try {
            stmt = conexao.prepareStatement(sql);
            
            stmt.setInt(1, cod_filme);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                qtd = rs.getInt("count");
            }
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return qtd;
    }

    @Override
    public Filme buscar(String titulo) {
        String sql = "select * from filme f, genero g where  f.cod_genero = g.cod_gen and f.titulo like ?";

        String sql_ator = "select nome from ator, ator_has_filme aht, filme f "
                + "where aht.ator_cod_ator = ator.cod_ator "
                + "and aht.filme_cod_filme = f.cod_filme "
                + "and f.cod_filme = ?";


        try {

            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setString(1, titulo);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                Filme a1 = new Filme();
                a1.setCodigo(rs.getInt("cod_filme"));


                PreparedStatement stmt3 = conexao.prepareStatement(sql_ator);
                stmt3.setInt(1, a1.getCodigo());
                ResultSet rs3 = stmt3.executeQuery();
                List<String> list_ator = new ArrayList<>();
                while (rs3.next()) {
                    String ator = rs3.getString("nome");
                    list_ator.add(ator);
                }
                rs3.close();
                stmt3.close();
                a1.setAtores(list_ator);



                a1.setPrecoLocacao(rs.getFloat("preco_locacao"));
                a1.setSinopse(rs.getString("sinopse"));
                a1.setTitulo(rs.getString("titulo"));
                a1.setDataLancamento(rs.getDate("data_lancamento"));
                a1.setDiretor(rs.getString("diretor"));
                a1.setGenero(buscarNomeGenero(rs.getInt("cod_genero")));
                a1.setNumeroCopias(qtdDVDs(rs.getInt("cod_filme")));
                return a1;
            }
            rs.close();
            stmt.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public void atualizar(Filme a) {
        String sql = " update filme set titulo=?,data_lancamento=?, diretor=?, sinopse= ?, preco_locacao=?, cod_genero = ? where cod_filme = ?";
        PreparedStatement stmt;
        try {
            stmt = conexao.prepareStatement(sql);


            stmt.setString(1, a.getTitulo());
            java.sql.Date sqlDate = new java.sql.Date(a.getDataLancamento().getTime());
            stmt.setDate(2, sqlDate);
            stmt.setString(3, a.getDiretor());
            stmt.setString(4, a.getSinopse());
            stmt.setFloat(5, a.getPrecoLocacao());
            stmt.setInt(6, buscarCodGenero(a.getGenero()));
            stmt.setLong(7, a.getCodigo());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }

       

        String sql_ator = "delete from ator_has_filme where filme_cod_filme=?";
        try {
            PreparedStatement stmt3 = conexao.prepareStatement(sql_ator);
            stmt3.setLong(1, a.getCodigo());
            stmt3.execute();
            stmt3.close();
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }


        String sql_ator_add = "insert into ator_has_filme (ator_cod_ator, filme_cod_filme) values(?,?)";
        try {
            List<Integer> lista = buscaCodAtores(a.getAtores());
            for (int i = 0; i < lista.size(); i++) {
                PreparedStatement stmt2 = conexao.prepareStatement(sql_ator_add);
                
                stmt2.setInt(1, lista.get(i));
                stmt2.setInt(2, a.getCodigo());
                stmt2.execute();
                stmt2.close();
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }

        

    }

    @Override
    public void deletar(int codigo) {

        String sql_e = "delete from filme where cod_filme= ?";
        PreparedStatement consulta_e;
        try {
            consulta_e = conexao.prepareStatement(sql_e);
            consulta_e.setLong(1, codigo);
            consulta_e.execute();
            consulta_e.close();
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        JOptionPane.showMessageDialog(null, "Excluído com sucesso.");

    }

    @Override
    public List<Filme> listar() {
        String sql = "select * from filme f, genero g where  f.cod_genero = g.cod_gen ";

        String sql_ator = "select nome from ator, ator_has_filme aht, filme f "
                + "where aht.ator_cod_ator = ator.cod_ator "
                + "and aht.filme_cod_filme = f.cod_filme "
                + "and f.cod_filme = ?";

        List<Filme> minhaLista = new ArrayList<>();
        try {
            PreparedStatement stmt2, stmt3, stmt4;
            PreparedStatement stmt = conexao.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                Filme a1 = new Filme();
                a1.setCodigo(rs.getInt("cod_filme"));


                stmt3 = conexao.prepareStatement(sql_ator);
                stmt3.setInt(1, a1.getCodigo());
                ResultSet rs3 = stmt3.executeQuery();
                List<String> list_ator = new ArrayList<>();
                while (rs3.next()) {
                    String ator = rs3.getString("nome");
                    list_ator.add(ator);
                }
                rs3.close();
                stmt3.close();
                a1.setAtores(list_ator);



                a1.setPrecoLocacao(rs.getFloat("preco_locacao"));
                a1.setSinopse(rs.getString("sinopse"));
                a1.setTitulo(rs.getString("titulo"));
                a1.setDataLancamento(rs.getDate("data_lancamento"));
                a1.setDiretor(rs.getString("diretor"));
                a1.setGenero(buscarNomeGenero(rs.getInt("cod_genero")));
                a1.setNumeroCopias(qtdDVDs(rs.getInt("cod_filme")));
                minhaLista.add(a1);
            }
            rs.close();
            stmt.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return minhaLista;

    }

    @Override
    public List<Filme> listar(String titulo) {
        String sql = "select * from filme f, genero g where  f.cod_genero = g.cod_gen and f.titulo like ?";

        String sql_ator = "select nome from ator, ator_has_filme aht, filme f "
                + "where aht.ator_cod_ator = ator.cod_ator "
                + "and aht.filme_cod_filme = f.cod_filme "
                + "and f.cod_filme = ?";

        List<Filme> minhaLista = new ArrayList<>();
        try {
            PreparedStatement stmt2, stmt3, stmt4;
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setString(1, titulo);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                Filme a1 = new Filme();
                a1.setCodigo(rs.getInt("cod_filme"));


                stmt3 = conexao.prepareStatement(sql_ator);
                stmt3.setInt(1, a1.getCodigo());
                ResultSet rs3 = stmt3.executeQuery();
                List<String> list_ator = new ArrayList<>();
                while (rs3.next()) {
                    String ator = rs3.getString("nome");
                    list_ator.add(ator);
                }
                rs3.close();
                stmt3.close();
                a1.setAtores(list_ator);



                a1.setPrecoLocacao(rs.getFloat("preco_locacao"));
                a1.setSinopse(rs.getString("sinopse"));
                a1.setTitulo(rs.getString("titulo"));
                a1.setDataLancamento(rs.getDate("data_lancamento"));
                a1.setDiretor(rs.getString("diretor"));
                a1.setGenero(buscarNomeGenero(rs.getInt("cod_genero")));
                a1.setNumeroCopias(qtdDVDs(rs.getInt("cod_filme")));
                minhaLista.add(a1);
            }
            rs.close();
            stmt.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return minhaLista;
    }

    @Override
    public Filme buscar(int codigo) {
        String sql = "select * from filme f, genero g where  f.cod_genero = g.cod_gen and f.cod_filme = ?";

        String sql_ator = "select nome from ator, ator_has_filme aht, filme f "
                + "where aht.ator_cod_ator = ator.cod_ator "
                + "and aht.filme_cod_filme = f.cod_filme "
                + "and f.cod_filme = ?";


        try {

            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setInt(1, codigo);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                Filme a1 = new Filme();
                a1.setCodigo(rs.getInt("cod_filme"));


                PreparedStatement stmt3 = conexao.prepareStatement(sql_ator);
                stmt3.setInt(1, a1.getCodigo());
                ResultSet rs3 = stmt3.executeQuery();
                List<String> list_ator = new ArrayList<>();
                while (rs3.next()) {
                    String ator = rs3.getString("nome");
                    list_ator.add(ator);
                }
                rs3.close();
                stmt3.close();
                a1.setAtores(list_ator);



                a1.setPrecoLocacao(rs.getFloat("preco_locacao"));
                a1.setSinopse(rs.getString("sinopse"));
                a1.setTitulo(rs.getString("titulo"));
                a1.setDataLancamento(rs.getDate("data_lancamento"));
                a1.setDiretor(rs.getString("diretor"));
                a1.setGenero(buscarNomeGenero(rs.getInt("cod_genero")));
                a1.setNumeroCopias(qtdDVDs(rs.getInt("cod_filme")));
                return a1;
            }
            rs.close();
            stmt.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public void criarGenero(String nome) {
        String sql = "insert into genero(nome) values (?)";
        try {
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setString(1, nome);
            stmt.execute();
            stmt.close();
            JOptionPane.showMessageDialog(null, "Adicionado com sucesso");
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void criarAtor(String nome) {
        String sql = "insert into ator(nome) values (?)";
        try {
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setString(1, nome);
            stmt.execute();
            stmt.close();
            JOptionPane.showMessageDialog(null, "Adicionado com sucesso");
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public String[] buscarAllAtor() {


        String sql = "select * from ator";

        String[] minhaLista = new String[100];
        try {
            PreparedStatement stmt2;
            PreparedStatement stmt = conexao.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            int i = 0;
            while (rs.next()) {
                minhaLista[i] = rs.getString("nome");
                i++;
            }
            rs.close();
            stmt.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return minhaLista;
    }

    private List<Integer> buscaCodAtores(List<String> atores) {
        String sql = "select cod_ator from ator where nome like ?";
        List<Integer> lista = new ArrayList<>();
        for (int i = 0; i < atores.size(); i++) {
            try {
                PreparedStatement stmt = conexao.prepareStatement(sql);
                stmt.setString(1, atores.get(i));
                ResultSet rs = stmt.executeQuery();
                while (rs.next()) {
                    lista.add(rs.getInt("cod_ator"));
                }
            } catch (SQLException ex) {
                Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return lista;
    }

    @Override
    public String[] buscarAllGeneros() {
        String sql = "select * from genero";

        String[] minhaLista = new String[30];
        try {

            PreparedStatement stmt = conexao.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            int i = 0;
            while (rs.next()) {
                minhaLista[i] = rs.getString("nome");
                i++;
            }
            rs.close();
            stmt.close();


        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return minhaLista;
    }

    private int buscarCodGenero(String genero) {
        String sql_genero = "select cod_gen from genero where nome like ?";
        PreparedStatement stmt_genero;
        int cod_genero = 0;
        try {
            stmt_genero = conexao.prepareStatement(sql_genero);

            stmt_genero.setString(1, genero);
            ResultSet rs_genero = stmt_genero.executeQuery();

            while (rs_genero.next()) {
                cod_genero = rs_genero.getInt("cod_gen");
            }
            rs_genero.close();
            stmt_genero.close();
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cod_genero;
    }

    private String buscarNomeGenero(int cod_genero) {
        String sql_genero = "select nome from genero where cod_gen = ?";
        PreparedStatement stmt_genero;
        String nome = null;
        try {
            stmt_genero = conexao.prepareStatement(sql_genero);

            stmt_genero.setInt(1, cod_genero);
            ResultSet rs_genero = stmt_genero.executeQuery();

            while (rs_genero.next()) {
                nome = rs_genero.getString("nome");
            }
            rs_genero.close();
            stmt_genero.close();
        } catch (SQLException ex) {
            Logger.getLogger(metodosFilme.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nome;
    }
}
